﻿#pragma once

#include<iostream>
#include<fstream>
#include <io.h>
#include<algorithm>
#include <cmath>
using namespace std;
struct AVLNode {
	string word;                       //单词 
	string mean;                       //注释 
	int height;                        //节点的高度 
	AVLNode* left;                     //左孩子 
	AVLNode* right;                    //右孩子 
};
class AVLTree {
private:
	AVLNode* root;                     //AVL树的根节点 
	string word[10000];
	string mean[10000];
	int word_length[27];               //从a到z每个不同开头单词的分别长度，开头第一个即word_lenghth[0] = 0,以便进行遍历
	int length;                        //单词总长度
	void InOrder(AVLNode* t);          //中序遍历内部接口
	AVLNode* FindWord(AVLNode* t, string eng);//单词查找内部接口
	AVLNode* Insert(AVLNode* t, string eng, string chi);//单词插入内部接口
	AVLNode* Delete(AVLNode* t, string eng);//单词删除内部接口

public:
	AVLTree();                        //构造函数 
	~AVLTree();                       //析构函数 
	void WordEnter();                 //文件录入函数 

	AVLNode* LL_Rotate(AVLNode* t);   //LL型旋转
	AVLNode* RR_Rotate(AVLNode* t);   //RR型旋转
	AVLNode* LR_Rotate(AVLNode* t);   //LR型旋转
	AVLNode* RL_Rotate(AVLNode* t);   //RL型旋转

	int GetHeight(AVLNode* t);        //求得树的高度
	void SetHeight(AVLNode* t, int height);//设置节点的高度值

	void InOrder();
	void FindWord();                  //单词查找函数外部接口
	void First_Insert();              //将单词从文件中读入到程序的数组中存储（程序自动录入已有单词时） 
	void Second_Insert();             //将单词从程序中写入到AVL树中(用户输入单词时)
	void DeleteWord();                //删除某一单词
	void DeleteAVLTree(AVLNode* p);   //AVL树析构时需要调用的函数 

	//删除单词函数中所需要用到的函数
	AVLNode* GetMaxNode(AVLNode* t);  //找到最大的节点
	AVLNode* GetMinNode(AVLNode* t);  //找到最小的节点
	void Update(int count);           //文件更新 
	void StartShow();                 //菜单
};